Universidad de San Andrés

Set de datos: Viajes de Remisería Presidencial

     

     

0 - Introducción

En Casa Rosada existe un servicio interno de “remisería” para realizar viajes laborales.

Hay un grupo de vehículos asignados a funcionarios determinados (con choferes fijos) y otro grupo de vehículos que son utilizados por diferentes choferes según las necesidades del día a día.

Los viajes se registran en un sistema de manera manual.

     

Consideraciones

Para poder utilizar los datos en este trabajo se realizaron las siguientes ediciones a la base:

  • los apellidos de los pasajeros fueron eliminados
  • las patentes de los vehículos fueron modificadas
  • varios destinos fueron cambiados por direcciones cercanas
  • dado que en el sistema no se registran las coordenadas de los destinos se realizó una búsqueda y carga manual por cada destino
     

     

1 - Preparación de ambiente, carga y limpieza de datos

Carga de Paquetes

#install.packages("sf")
#install.packages("leaflet")
#install.packages("janitor") #https://elradar.github.io/2019/10/19/un-cran-a-la-vez-janitor/
#install.packages("openxlsx")
#install.packages("osrm")
#install.packages("osmdata")
#install.packages("plotly")
#install.packages("ggmap")
#install.packages("lubridate")



library(tidyverse)
library(readxl)
library(ggplot2)

library(sf)           # Manipulacion de datos geográficos
library(leaflet)      # Graficos interactivos
library(raster)      # classes and functions for raster data

library(lubridate)    # Fechas y horas
library(hms)          # Horas - Minutos y Segundos
library(janitor)      # limpieza de datos importados desde excel
library(openxlsx)     # Exporta datos a excel #write.xlsx(escuelas, "escuelasguardadas.xlsx")
library(osrm)
library(osmdata)
library(plotly)
library(htmltools)
library(RColorBrewer)
library(ggmap)
library(gmapsdistance)

   

Definición de cantidad de ceros sin utilizar notación científica

options(scipen=20)#dice cuantos 0 acepta antes de usar la notacion científica

   

Carga de datos

Carga de datos geográficos

departamentos <- st_read("Codgeo_Pais_x_dpto_con_datos/pxdptodatosok.shp")
## Reading layer `pxdptodatosok' from data source `C:\Users\ejsan\Google Drive\DB\06-Desarrollo\Curso R UDESA\Proyecto\Codgeo_Pais_x_dpto_con_datos\pxdptodatosok.shp' using driver `ESRI Shapefile'
## Simple feature collection with 527 features and 10 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -74.02985 ymin: -90 xmax: -25.02314 ymax: -21.74506
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs

   

Carga del archivo Excel

viajes <- read_excel("base_transporte_terrestre_guardia.xlsx")

   

Limpieza de datos importados del Excel

Vista estructura general de datos

str(viajes)
## Classes 'tbl_df', 'tbl' and 'data.frame':    2200 obs. of  19 variables:
##  $ ID                                : num  289 702 777 1059 976 ...
##  $ Estado                            : chr  "cerrada" "cerrada" "cerrada" "cerrada" ...
##  $ Resumen                           : chr  "VIAJE UNIDAD.MEDICA" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" ...
##  $ Descripción                       : chr  "VIAJE UNIDAD.MEDICA" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" ...
##  $ 0.1.1 - Dependencia               : chr  "Unidad Médica Presidencial" "Secretaría General" "Secretaría General" "Secretaría General" ...
##  $ 7.0.1 - Origen                    : chr  "Peron, Juan Domingo, Tte. General 115" "Peron, Juan Domingo, Tte. General 115" "Peron, Juan Domingo, Tte. General 115" "Peron, Juan Domingo, Tte. General 115" ...
##  $ latitud_origen                    : chr  "-34.604793" "-34.604793" "-34.604793" "-34.604793" ...
##  $ longitud_origen                   : chr  "-58.369208" "-58.369208" "-58.369208" "-58.369208" ...
##  $ 7.0.1 - Pasajero                  : chr  "DR.COSTA" "FEDERICO M" "FEDERICO M" "FEDERICO M" ...
##  $ 7 0 2 - Destino OK                : chr  "Av. Comodoro Py 2002" "Guatemala 4201" "Guatemala 4201" "Guatemala 4201" ...
##  $ latitud_destino                   : chr  "-34.587579" "-34.589203" "-34.589203" "-34.589203" ...
##  $ longitud_destino                  : chr  "-58.369092" "-58.419093" "-58.419093" "-58.419093" ...
##  $ 7.0.3 - Fecha Viaje               : chr  "14-11-2018" "14-09-2018" "06-09-2018" "03-08-2018" ...
##  $ 7.0.4 - Hora Salida               : chr  "23:30" "22:30" "22:00" "23:00" ...
##  $ 7.0.4.1 - Hora Solicitada         : chr  NA "23:15" "23:10" "23:55" ...
##  $ 7.0.4.2 - Hora Destino Funcionario: chr  NA NA NA NA ...
##  $ 7.0.5 - Hora Regreso              : chr  "01:30" "00:30" "00:00" "01:20" ...
##  $ 7.0.6 - Conductor                 : chr  "GARCIA Mario Antonio" "ROCHA Juan Marcelo" NA "ROCHA Juan Marcelo" ...
##  $ 7.0.7 - DoTiTio VIhícuMo          : chr  "AA568.TI" "AA568TI" "AA568TI" "TTT991" ...

 

Observaciones:

Acá se pueden ver que hay datos de longitud y latitud con y sin apóstrofe inicial (“’-58.456663” “-58.397926”) y con finales de línea “ r  n”. Hay que quitar el apóstrofe inicial y los finales de línea para poder mapear el dato.

   

Vista general de datos

summary(viajes)
##        ID            Estado            Resumen          Descripción       
##  Min.   :   1.0   Length:2200        Length:2200        Length:2200       
##  1st Qu.: 550.8   Class :character   Class :character   Class :character  
##  Median :1100.5   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :1100.5                                                           
##  3rd Qu.:1650.2                                                           
##  Max.   :2200.0                                                           
##  0.1.1 - Dependencia 7.0.1 - Origen     latitud_origen    
##  Length:2200         Length:2200        Length:2200       
##  Class :character    Class :character   Class :character  
##  Mode  :character    Mode  :character   Mode  :character  
##                                                           
##                                                           
##                                                           
##  longitud_origen    7.0.1 - Pasajero   7 0 2 - Destino OK
##  Length:2200        Length:2200        Length:2200       
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
##  latitud_destino    longitud_destino   7.0.3 - Fecha Viaje
##  Length:2200        Length:2200        Length:2200        
##  Class :character   Class :character   Class :character   
##  Mode  :character   Mode  :character   Mode  :character   
##                                                           
##                                                           
##                                                           
##  7.0.4 - Hora Salida 7.0.4.1 - Hora Solicitada
##  Length:2200         Length:2200              
##  Class :character    Class :character         
##  Mode  :character    Mode  :character         
##                                               
##                                               
##                                               
##  7.0.4.2 - Hora Destino Funcionario 7.0.5 - Hora Regreso
##  Length:2200                        Length:2200         
##  Class :character                   Class :character    
##  Mode  :character                   Mode  :character    
##                                                         
##                                                         
##                                                         
##  7.0.6 - Conductor  7.0.7 - DoTiTio VIhícuMo
##  Length:2200        Length:2200             
##  Class :character   Class :character        
##  Mode  :character   Mode  :character        
##                                             
##                                             
## 

 

Observaciones:

Acá se puede observar que hay que modificar el tipo de dato de los campos horas para poder realizar cálculos de tiempos de viaje. Ver transformación char a horas:minutos

   

   

Inicio limpieza de datos

Cambio de nombre de las columnas

# Cambio de nombre de las columnas
names(viajes)=c("id_viaje", "estado","resumen","descripcion","dependencia","origen","latitud_origen","longitud_origen","pasajero","destino","latitud_destino","longitud_destino","fecha_viaje","hora_salida","hora_solicitada","hora_destino_funcionario","hora_regreso","conductor","patente_vehiculo")

   

Retiro columnas que no tienen relevancia para el trabajo

# Retiro columnas que no tienen relevancia para el trabajo
viajes <- viajes %>% 
  select(-resumen, -descripcion, -estado, -hora_destino_funcionario, -hora_solicitada)
head(viajes) 
## # A tibble: 6 x 14
##   id_viaje dependencia origen latitud_origen longitud_origen pasajero
##      <dbl> <chr>       <chr>  <chr>          <chr>           <chr>   
## 1      289 Unidad Méd~ Peron~ -34.604793     -58.369208      DR.COSTA
## 2      702 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 3      777 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 4     1059 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 5      976 Unidad Méd~ Peron~ -34.604793     -58.369208      DR.HOFF~
## 6     2025 Admin. Ser~ Peron~ -34.604793     -58.369208      ARIAS   
## # ... with 8 more variables: destino <chr>, latitud_destino <chr>,
## #   longitud_destino <chr>, fecha_viaje <chr>, hora_salida <chr>,
## #   hora_regreso <chr>, conductor <chr>, patente_vehiculo <chr>

   

Breve descripción de las columnas

  • id_viaje: identificador autonumérico del viaje
  • dependencia: Dependencia de la Secretaría General o Jefatura de Gabiente de Ministros a la que pertenece la persona que solicita el viaje.
  • origen: punto de partida del viaje;
  • latitud_origen: coordenada
  • longitud_origen: coordenada
  • pasajero: Nombre de la persona transportda
  • destino:dirección o nombre del destino (algunos destinos fueron modificados para no tener vínculo con los originales)
  • latitud_destino: coordenda
  • longitud_destino: coordenada
  • fecha_viaje
  • hora_salida
  • hora_regreso
  • conductor:nombre del choffer
  • patente_vehiculo: dominio del vehículo (los datos fueron modificados para no tener vehículo con los originales)

   

Limpieza de columna patente_vehiculo

Quito puntos, guiones, dos puntos
# Quito puntos, guiones, dos puntos
viajes$patente_vehiculo <- gsub("[[:punct:]]", "", viajes$patente_vehiculo) 

#grabo modificaciones en nueva variable  
viajes_a <- viajes

   

Quito espacios
#Quito espacios
viajes_a$patente_vehiculo <- gsub(" ","" , viajes_a$patente_vehiculo ,ignore.case = TRUE)  


#grabo modificaciones en nueva variable  
viajes_b <- viajes_a

   

Columnas de horas

Paso las horas a formato hora usando paquete hms
#Paso las horas a formato hora usando paquete hms
viajes_b$hora_salida <- parse_hm(viajes_b$hora_salida)
viajes_b$hora_regreso <- parse_hm(viajes_b$hora_regreso)
head(viajes_b)
## # A tibble: 6 x 14
##   id_viaje dependencia origen latitud_origen longitud_origen pasajero
##      <dbl> <chr>       <chr>  <chr>          <chr>           <chr>   
## 1      289 Unidad Méd~ Peron~ -34.604793     -58.369208      DR.COSTA
## 2      702 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 3      777 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 4     1059 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 5      976 Unidad Méd~ Peron~ -34.604793     -58.369208      DR.HOFF~
## 6     2025 Admin. Ser~ Peron~ -34.604793     -58.369208      ARIAS   
## # ... with 8 more variables: destino <chr>, latitud_destino <chr>,
## #   longitud_destino <chr>, fecha_viaje <chr>, hora_salida <time>,
## #   hora_regreso <time>, conductor <chr>, patente_vehiculo <chr>

Volver a Vista general de datos

   

Reviso valores NA

# Reviso valores NA 
sapply(viajes_b,function(x) sum(is.na(x)))
##         id_viaje      dependencia           origen   latitud_origen 
##                0                0                0                0 
##  longitud_origen         pasajero          destino  latitud_destino 
##                0                0                0                0 
## longitud_destino      fecha_viaje      hora_salida     hora_regreso 
##                0                0               73              211 
##        conductor patente_vehiculo 
##               71               39

   

Quito filas con valores NA

# Retiro filas con patentes_vehiculo y conductor NA
viajes_b <- viajes_b[!is.na(viajes_b$patente_vehiculo),] 
viajes_b <- viajes_b[!is.na(viajes_b$conductor),]

# Quito viajes con horas NA
viajes_b <- viajes_b[!is.na(viajes_b$hora_salida),] 
viajes_b <- viajes_b[!is.na(viajes_b$hora_regreso),]

#grabo modificaciones en nueva variable
viajes_c <- viajes_b

   

Reviso si existen horas de regreso menores a los horarios de salida.

# Reviso si existen horas de regreso menores a los horarios de salida.
a <- filter(viajes_c, hora_salida > hora_regreso)
a
## # A tibble: 6 x 14
##   id_viaje dependencia origen latitud_origen longitud_origen pasajero
##      <dbl> <chr>       <chr>  <chr>          <chr>           <chr>   
## 1      289 Unidad Méd~ Peron~ -34.604793     -58.369208      DR.COSTA
## 2      702 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 3     1059 Secretaría~ Peron~ -34.604793     -58.369208      FEDERIC~
## 4      976 Unidad Méd~ Peron~ -34.604793     -58.369208      DR.HOFF~
## 5      999 Unidad Méd~ Peron~ -34.604793     -58.369208      DR.HOFF~
## 6     2043 Dir. Gral.~ Peron~ -34.604793     -58.369208      JULIETA~
## # ... with 8 more variables: destino <chr>, latitud_destino <chr>,
## #   longitud_destino <chr>, fecha_viaje <chr>, hora_salida <time>,
## #   hora_regreso <time>, conductor <chr>, patente_vehiculo <chr>

   

Nota:
  • Para simplificar el análisis quito los viajes que cumplen con la condiciones anterior (mantengo solo los viajes intra diarios)

 

viajes_c <- filter(viajes_c, hora_salida<hora_regreso)

   

Calculo duracion de viajes en minutos (nueva columna duracion_viaje)

# Calculo duracion de viajes en minutos
viajes_c <- viajes_c %>% 
  mutate(duracion_viaje = difftime(viajes_c$hora_regreso,viajes_c$hora_salida))

   

Paso la diferencia horaria a formato numero

# Paso la diferencia horaria a formato numero
viajes_c <- viajes_c %>% 
  mutate(duracion_viaje_numerico = as.numeric(viajes_c$duracion_viaje))

head(viajes_c$duracion_viaje_numerico)
## [1] 10 10 15 20 20 20
#grabo modificaciones en nueva variable
viajes_d <- viajes_c

   

2. Visualización general de datos

Duración de tiempos de viaje

Utilizando hist()

hist(viajes_d$duracion_viaje_numerico, main="Viajes",
xlab="Duración de los Viajes en Minuto",
ylab = "Cantidad de Viajes",
col="magenta")

 

Observaciones:

La mayor parte de los viajes tiene una duración menor a 200 minutos-

   

Vista sumarizada

summary(viajes_d$duracion_viaje_numerico)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    10.0    70.0   105.0   121.5   150.0   990.0

 

Utilizando ggplot

ggplot(viajes_d) + 
    geom_histogram(aes(x = duracion_viaje_numerico),
                 binwidth = 30, col="orange", 
                 fill="green", 
                 alpha = .3) +
     labs(
       title="Viajes", 
       subtitle = "Cantidad de Viajes x Duración",
       x = "Duración de los Viajes en Minutos",
       y = "Cantidad de Viajes" )

   

Creación de tablas agrupadoras

Creación de tabla de viajes por conductor

#tabla de viajes por conductor
viajes_por_conductor <- viajes_d %>% 
  group_by(conductor) %>% 
  summarise(
    cant_viajes=n(),
    hora_totales_viaje =round(sum(duracion_viaje_numerico)/60, digits=2),
    promedio_tiempo_viaje_min = round(mean(duracion_viaje_numerico),digits=2),
    destinos_distintos = n_distinct(destino),
    cant_autos_que_maneja = n_distinct(patente_vehiculo)
    )
head(viajes_por_conductor)
## # A tibble: 6 x 6
##   conductor cant_viajes hora_totales_vi~ promedio_tiempo~ destinos_distin~
##   <chr>           <int>            <dbl>            <dbl>            <int>
## 1 ALVAREZ ~          42            108               154.               16
## 2 ARIAS Cl~          81            170.              126.               27
## 3 BRANDAN ~          16             31.1             117.               10
## 4 BULGOS E~          23             58               151.               13
## 5 CAPOZZUC~         141            257.              109.               31
## 6 CATRILEF~         116            228.              118.               30
## # ... with 1 more variable: cant_autos_que_maneja <int>

   

Grafico cantidad de viajes por conductor y uso de un mismo vehículo

 ggplot() + 
  geom_bar(data = viajes_por_conductor, 
           aes(x = reorder(conductor, cant_viajes), 
               weight = cant_viajes,
               fill = cant_autos_que_maneja) )+
  scale_fill_continuous(low="yellow", high="red")+
  labs(
       title="Cantidad de Viajes por Conductor", 
       subtitle = "Cantidad de autos que maneja cada conductor",
       x = "Conductor",
       y = "Cantidad de viajes" )+
  coord_flip()

 

Observaciones:
En este gráfico se refleja la existencia de dos “grupos” de choferes
  • Choferes que no tiene vehículos fijos, son los que están asignados a la guardia y manejan la unidad que esté disponible al momento del viaje.
  • Choferes que tienen uno o dos vehículos asignados y son los que están disponibles para un funcionario en particular

   

Creación de tabla de viajes por dependencia

#tabla de viajes por conductor
viajes_por_dependencia <- viajes_d %>% 
  group_by(dependencia) %>% 
  summarise(
    cant_viajes=n(),
    promedio_tiempo_viaje_min = round(mean(duracion_viaje_numerico),digits=2),
    destinos_distintos = n_distinct(destino),

    )
head(viajes_por_dependencia)
## # A tibble: 6 x 4
##   dependencia             cant_viajes promedio_tiempo_via~ destinos_distin~
##   <chr>                         <int>                <dbl>            <int>
## 1 Admin. Servicios Gener~         196                125.                37
## 2 Agrupación Aérea                  2                172.                 2
## 3 Asesor Presidencial               3                205                  3
## 4 ASG - Departamento de ~           2                160                  2
## 5 ASG - Departamento de ~         340                 77.4               41
## 6 ASG - Economato                 208                140.                20
ggplot() + 
  geom_bar(data = viajes_por_dependencia,
           aes(x = reorder(dependencia, cant_viajes), 
               weight = cant_viajes),fill = "green", color = "orange", alpha = .3) +
  labs(
       title="Viajes por Dependencia", 
       x = "Dependencia",
       y = "Cantidad de Viajes" )+
  coord_flip() 

 

Observaciones:
En este gráfico y, conociendo el funcionamiento de la remisería, se puede observar lo siguiente
  • Los viajes de la dependencia ASG - Departamento de Transporte Terrestre no deberían estar registrados de esa manera ya que son la misma dependencia que realiza los viajes. Se puede deducir un error en la carga del viaje.
  • Podría plantearse la posibilidad de asigar vehículos a las dependencias que más viajes realizan

   

Creación de tabla viajes por vehículo

#viajes por vehiculo
viajes_por_vehiculo <- viajes_d %>% 
  group_by(patente_vehiculo) %>% 
  summarise(
    cant_viajes=n(),
    hora_totales_viaje =round(sum(duracion_viaje_numerico)/60, digits=2),
    destinos_distintos = n_distinct(destino),
    conductores_distintos = n_distinct(conductor),
    
    )

head(viajes_por_vehiculo)
## # A tibble: 6 x 5
##   patente_vehiculo cant_viajes hora_totales_vi~ destinos_distin~
##   <chr>                  <int>            <dbl>            <int>
## 1 0XC263                     1             5.25                1
## 2 AA468MS                    1             1.5                 1
## 3 AA523MP                  349           710.                 44
## 4 AA523MS                  128           229.                 27
## 5 AA523MT                    7            10                   4
## 6 AA523MX                    4             6.17                3
## # ... with 1 more variable: conductores_distintos <int>

   

Cantidad de viajes / horas de viaje por vehículo

ggplot(viajes_por_vehiculo, 
       aes(y = cant_viajes,x = reorder(patente_vehiculo, cant_viajes), 
               weight = cant_viajes,
               fill = hora_totales_viaje) ) + 
    geom_bar(position="stack", stat="identity") +
   scale_fill_continuous(low="yellow", high="red")+
   theme(axis.text.x = element_text(angle = 90, hjust = 1))+
   labs(
       title="Viajes por Vehículo", 
       x = "Patente Vehículo",
       y = "Cantidad de Viajes" )+
  geom_text(aes(label=cant_viajes), vjust=1.5, color="white", size=3, angle = 90)

   

“Zoom” en vehículos con más de 25 viajes

viajes_por_vehiculo_25 <- viajes_por_vehiculo %>% 
  filter(cant_viajes>25)


ggplot(viajes_por_vehiculo_25, 
       aes(y = cant_viajes,x = reorder(patente_vehiculo, cant_viajes), 
               weight = cant_viajes,
               fill = hora_totales_viaje) ) + 
    geom_bar(position="stack", stat="identity") +
   scale_fill_continuous(low="yellow", high="red")+
   theme(axis.text.x = element_text(angle = 90, hjust = 1))+
   labs(
       title="Viajes por Vehículo", 
       x = "Patente Vehículo",
       y = "Cantidad de Viajes" )+
  geom_text(aes(label=cant_viajes), vjust=0.5,hjust=1.25, color="white", size=4, angle = 90)

 

Observaciones:

En estos gráficos se puede ver que hay pocos autos que realizan la mayor cantidad de viajes. Esto puede estar explicado por la asignación fija de vehículos a determinados funcionarios.

 

   

Viajes según día de la semana

Agrego columna dia_viaje y dia_orden

viajes_d <- viajes_d %>% 
  mutate(dia_viaje = weekdays(as.Date(dmy(viajes_d$fecha_viaje)))) %>% 
  mutate(dia_orden = wday(as.Date(dmy(viajes_d$fecha_viaje))))
           
    #con dmy le "digo" a weekdays como está escrita la fecha (dia-mes-año)

#guardo cambio en nueva variable
viajes_e <- viajes_d



head(viajes_e)
## # A tibble: 6 x 18
##   id_viaje dependencia origen latitud_origen longitud_origen pasajero
##      <dbl> <chr>       <chr>  <chr>          <chr>           <chr>   
## 1      519 ASG - Depa~ Peron~ -34.604793     -58.369208      DITCHOFF
## 2     1574 Dir. Gral.~ Peron~ -34.604793     -58.369208      ROXANA  
## 3     2174 ASG - Econ~ Peron~ -34.604793     -58.369208      TUCHI   
## 4      103 ASG - Depa~ Peron~ -34.604793     -58.369208      DITCHOFF
## 5      730 Admin. Ser~ Peron~ -34.604793     -58.369208      ROCHA J 
## 6     1235 ASG - Depa~ Peron~ -34.604793     -58.369208      LAROTON~
## # ... with 12 more variables: destino <chr>, latitud_destino <chr>,
## #   longitud_destino <chr>, fecha_viaje <chr>, hora_salida <time>,
## #   hora_regreso <time>, conductor <chr>, patente_vehiculo <chr>,
## #   duracion_viaje <drtn>, duracion_viaje_numerico <dbl>, dia_viaje <chr>,
## #   dia_orden <dbl>

   

Creación de tabla agrupada de Viajes por día de Semana

#tabla de viajes por día de la semana
viajes_por_dia_de_semana <- viajes_e %>% 
  group_by(dia_viaje, dia_orden) %>% 
  summarise(
    cant_viajes=n(),
    hora_totales_viaje =round(sum(duracion_viaje_numerico)/60, digits=2),
    destinos_distintos = n_distinct(destino),
    )
viajes_por_dia_de_semana
## # A tibble: 7 x 5
## # Groups:   dia_viaje [7]
##   dia_viaje dia_orden cant_viajes hora_totales_viaje destinos_distintos
##   <chr>         <dbl>       <int>              <dbl>              <int>
## 1 domingo           1          47               69.8                 18
## 2 jueves            5         349              705.                  50
## 3 lunes             2         289              522.                  47
## 4 martes            3         367              729.                  47
## 5 miércoles         4         386              836.                  50
## 6 sábado            7          64              136.                  21
## 7 viernes           6         380              813.                  45

   

Grafico Cantidad de Viajes por Día de Semana

p <- ggplot(data=viajes_por_dia_de_semana, 
            aes(x=reorder(dia_viaje, dia_orden), y=cant_viajes)) +
   geom_bar(stat="identity", width=0.90, fill="steelblue")+
   geom_text(aes(label=cant_viajes), vjust=1.6, color="white", size=3.5)+
  labs(
       title="Cantidad de Viajes por Día de Semana", 
       x = "Día de semana",
       y = "Cantidad de Viajes" )+
  theme_minimal()
p

 

Observaciones:

La distribución de viajes tiene correspondencia con el manejo cotiadiano de la remisería.

   

Creo tabla agrupadora destino | conductor | duracion_viaje_numerico

destinos_tiempos_viaje_conductores <- viajes_e %>% 
  select(destino, conductor, duracion_viaje_numerico)

head(destinos_tiempos_viaje_conductores)
## # A tibble: 6 x 3
##   destino                             conductor        duracion_viaje_nume~
##   <chr>                               <chr>                           <dbl>
## 1 Las Heras, General 1680             ROCHA Juan Marc~                   10
## 2 Quinta Presidencial de Olivos (Oli~ ARIAS Claudio                      10
## 3 Quinta Presidencial de Olivos (Oli~ ALVAREZ Ariel                      15
## 4 Quinta Presidencial de Olivos (Oli~ FIGUERAS Maximi~                   20
## 5 Quinta Presidencial de Olivos (Oli~ ROCHA Juan Carl~                   20
## 6 Av Roca y Av Escalada               LAROTONDA Hécto~                   20

   

Creación de tabla agrupada de duraciones promedio de viajes por destino y conductor

destinos_tiempos_viaje_conductores <- viajes_e %>% 
  group_by(destino, conductor) %>% 
  summarise(
    promedio_tiempo_viaje=round(mean(duracion_viaje_numerico),digits = 2),
    cant_viajes=n()
       ) 
head(destinos_tiempos_viaje_conductores)
## # A tibble: 6 x 4
## # Groups:   destino [2]
##   destino              conductor            promedio_tiempo_vi~ cant_viajes
##   <chr>                <chr>                              <dbl>       <int>
## 1 11 DE SEPTIEMBRE 28~ CAPOZZUCCA Humberto~                60             1
## 2 25 DE MAYO 741       ALVAREZ Ariel                      140             2
## 3 25 DE MAYO 741       ARIAS Claudio                       98.8           4
## 4 25 DE MAYO 741       CAPOZZUCCA Humberto~               275             1
## 5 25 DE MAYO 741       CATRILEF Daniel                    118.            3
## 6 25 DE MAYO 741       FIGUERAS Maximiliano                68             5

   

Para el análisis selecciono los registros con cant_viajes mayor a 20

destinos_tiempos_viaje_conductores_top_20 <- destinos_tiempos_viaje_conductores %>% 
    filter(cant_viajes>20)

destinos_tiempos_viaje_conductores_top_20
## # A tibble: 14 x 4
## # Groups:   destino [4]
##    destino                  conductor         promedio_tiempo_~ cant_viajes
##    <chr>                    <chr>                         <dbl>       <int>
##  1 Aeroparque Jorge Newber~ FIGUERAS Maximil~             106.           22
##  2 Av Roca y Av Escalada    GAZZANEGO Albert~              50.4          22
##  3 Av Roca y Av Escalada    LAROTONDA Héctor~              47.7          30
##  4 Av Roca y Av Escalada    ROCHA Juan Marce~              49.8          22
##  5 Pza. Rep. del Paraguay   CATRILEF Daniel               104.           22
##  6 Quinta Presidencial de ~ ARIAS Claudio                  99.4          26
##  7 Quinta Presidencial de ~ CAPOZZUCCA Humbe~             116.           63
##  8 Quinta Presidencial de ~ CATRILEF Daniel               137.           31
##  9 Quinta Presidencial de ~ DIAZ DE ESPADA V~             101.           36
## 10 Quinta Presidencial de ~ FIGUERAS Maximil~             125.          128
## 11 Quinta Presidencial de ~ GAZZANEGO Albert~             116.           81
## 12 Quinta Presidencial de ~ LAROTONDA Héctor~             140.          105
## 13 Quinta Presidencial de ~ ROCHA Juan Carlos             163.           61
## 14 Quinta Presidencial de ~ ROCHA Juan Marce~             116.           64

 

Observaciones:

Solo hay 14 combinaciones destino/conductor con mas de 20 viajes

   

Grafico los destinos junto con los tiempos promedios de viaje por conductor
 ggplot(data = destinos_tiempos_viaje_conductores_top_20, aes(x = conductor, y = promedio_tiempo_viaje)) +
   geom_bar(stat="identity", width=0.90, fill="steelblue") +
   facet_wrap(~ destinos_tiempos_viaje_conductores_top_20$destino)+
 
theme( axis.text.x = element_text( angle = 90,  hjust = 1 ) )

 

Observaciones:

Solo hay dos destinos que tienen mas de 20 viajes y mas de un conductor que haya realizado esos viajes.

   

Grafico los destinos que tienen mas de 20 viajes y mas de un conductor que haya realizado esos viajes.
tabla <- destinos_tiempos_viaje_conductores_top_20 %>% 
  filter(destino == "Quinta Presidencial de Olivos (Olivos, Vicente López)" | destino == "Av Roca y Av Escalada")

 ggplot(data = tabla, aes(x = conductor, y = promedio_tiempo_viaje)) +
   geom_bar(stat="identity", width=0.90, fill="steelblue") +
  facet_wrap(~ tabla$destino)+
 
theme( axis.text.x = element_text( angle = 90,  hjust = 1 ) )

 

Observaciones:

No hay diferencias significativas entre los los tiempos promedios de viajes para los mismos conductores y destinos.

   


Manejo / Limpieza de longitudes y latitudes

Limpieza de columnas de latitud y longitud

Retiro apostrofe inicial
#Retiro apostrofe inicial
  viajes_e$latitud_origen <- gsub("'","" , viajes_e$latitud_origen ,ignore.case = TRUE)  
  viajes_e$longitud_origen <- gsub("'","" , viajes_e$longitud_origen ,ignore.case = TRUE)  
  viajes_e$latitud_destino <- gsub("'","" , viajes_e$latitud_destino ,ignore.case = TRUE)
  viajes_e$longitud_destino <- gsub("'","" , viajes_e$longitud_destino ,ignore.case = TRUE)

Volver a Vista estructura general de datos

   

Retiro fin de linea
  viajes_e$latitud_origen <- gsub("[\r\n]","" , viajes_e$latitud_origen ,ignore.case = TRUE)  
  viajes_e$longitud_origen <- gsub("[\r\n]","" , viajes_e$longitud_origen ,ignore.case = TRUE)  
  viajes_e$latitud_destino <- gsub("[\r\n]","" , viajes_e$latitud_destino ,ignore.case = TRUE)
  viajes_e$longitud_destino <- gsub("[\r\n]","" , viajes_e$longitud_destino ,ignore.case = TRUE)

   

Paso latitudes y longitudes a formato numérico

#Paso latitudes y longitudes a numero
viajes_e <- viajes_e %>%
 mutate(latitud_origen_num = as.double(latitud_origen),
        longitud_origen_num = as.double(longitud_origen),
        latitud_destino_num = as.double(latitud_destino),
        longitud_destino_num = as.double(longitud_destino))

   

Reviso que los rangos de latitudes y longitudes estén dentro de de Argentina (Longitud: -64.0000000 Latitud: -34.0000000)

#grabo modificaciones en nueva variable
viajes_f <- viajes_e

summary(viajes_f$longitud_origen_num)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -58.37  -58.37  -58.37  -58.37  -58.37  -58.37
summary(viajes_f$latitud_origen_num)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   -34.6   -34.6   -34.6   -34.6   -34.6   -34.6
summary(viajes_f$longitud_destino_num)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  -58.71  -58.48  -58.43  -58.43  -58.40  -57.65       1
summary(viajes_f$latitud_destino_num)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -38.16  -34.61  -34.58  -34.62  -34.51  -34.41

   

Grafico en el mapa

departamentos_viajes <- departamentos %>% 
  filter(codpcia == "02" | codpcia == "06")

ggplot()+
  geom_sf(data=departamentos_viajes) +
  geom_point(data=viajes_f,
             aes(x=longitud_destino_num,
                 y=latitud_destino_num)) +
   coord_sf(xlim = c(-58.7, -58.2), ylim = c(-34.8, -34.51), expand = FALSE) +
  labs(title = "Remisería Presidencial",
       subtitle="Destinos Viajes")

   

Creación de tabla viajes por destino

#viajes por destino
viajes_por_destino <- viajes_f %>% 
  group_by(destino,longitud_destino_num,latitud_destino_num) %>% 
  summarise(
    cant_viajes=n()
    
    )

head(viajes_por_destino)
## # A tibble: 6 x 4
## # Groups:   destino, longitud_destino_num [6]
##   destino                 longitud_destino_n~ latitud_destino_~ cant_viajes
##   <chr>                                 <dbl>             <dbl>       <int>
## 1 11 DE SEPTIEMBRE 2810 ~               -58.5             -34.6           1
## 2 25 DE MAYO 741                        -58.4             -34.6          30
## 3 3 DE FEBRERO AL 2000 C~               -58.5             -34.6           2
## 4 Aeroparque Jorge Newbe~               -58.4             -34.6          71
## 5 Aeropuerto Internacion~               -58.6             -34.8          14
## 6 Agrelo 4050                           -58.4             -34.6           4

   

Grafico en el mapa heatmap viajes

Selecciono departamentos CABA y Pcia. de Bs. As.

#selecciono departamentos CABA y Pcia. de Bs. As.
departamentos_viajes_destino <- departamentos %>% 
  filter(codpcia == "02" | codpcia == "06")

   

Armo el mapa centrado en CABA

#Armo el mapa centrado en CABA
mapa_viajes_por_destino <- ggplot()+
  geom_sf(data = departamentos_viajes_destino)+
  geom_point(data = viajes_por_destino,
             aes(x = longitud_destino_num,
                 y = latitud_destino_num,
                 size=2, color=cant_viajes)) + 
   coord_sf(xlim = c(-58.7, -58.2), ylim = c(-34.8, -34.51), expand = FALSE) +
   labs(title = "Remisería Presidencia",
       subtitle="Destinos Viajes")

   #defino los colores para mostrar las catidades de viajes por destino
   mapa_viajes_por_destino <- mapa_viajes_por_destino + 
   scale_color_gradient(low="blue", high="red")

   

HeatMap por cantidad de viajes por destinos con librería ggplotly

# Grafico el mapa mostrando en hover destino y cantidad de viajes
ggplotly(mapa_viajes_por_destino, tooltip = c("destino", "cant_viajes")) 

 

Observaciones:

Se puede observar una gran diferencia en la cantidad de viajes a la Residencia Presidencial de Olivios. Una de las razones principales, además de los viajes de rutina, es que hacia inicios del año 2017 se quitó la lavandería existente en Casa Rosada y se comenzaron a enviar los manteles, individuales, servilletas y demás blanquería a la lavandería de Olivos.

   

Mapa dinámico con leaflet (se pueden ver los viajes a Chapadmalal moviendo la ubicación del mapa)

#se usa el paquete leaflet para hacer mapas dinamicos

paleta_colores <- colorNumeric("Spectral",domain = viajes_por_destino$cant_viajes, reverse = T, n=8)

leaflet() %>% 
  setView(lng = -58.43, lat = -34.58, zoom = 12) %>% 
  addTiles() %>%  
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = departamentos_viajes_destino, 
                stroke = FALSE,
                fill = "#D24618",
                color = "#D24618",
                opacity = 0.55,
                fillOpacity = 0.01,
                weight = 3 ) %>% 
  addCircles(data=viajes_por_destino,
           lng = ~longitud_destino_num,
           lat = ~latitud_destino_num,
           weight =2,
           #cambio el tamaño de los puntos según la cantidad de viajes
          # radius = ~sqrt(cant_viajes) * 33,
          #cambio el color de los puntos según la cantidad de viajes
           radius = 350,
           color = ~paleta_colores(cant_viajes), fillOpacity = 0.95,
           popup = ~htmlEscape(paste0(destino," | viajes: ", cant_viajes))
                          ) 

 


   

Análisis de viajes utilizando paquete ggmaps

Convierto las coordenadas en cadena “latitud+longitud”

viajes_f <- viajes_f %>% 
  mutate(coords_origen = paste0(latitud_origen_num,"+",longitud_origen_num)) %>%
  mutate(coords_destino = paste0(latitud_destino_num,"+",longitud_destino_num))

 

Para reducir el uso de la api de Google armo una tabla de viajes únicos

viajes_unicos <-  viajes_f %>% 
  group_by(origen, destino,coords_origen,coords_destino) %>% 
  summarise(
    cant_viajes_distintos=n(),
    #calculo la duración promedio de un tramo del viaje (por ejemplo la ida) para poder comparar con lo obtenido de la app de Google
    duracion_viaje_promedio_1_tramo = round(mean(duracion_viaje_numerico)/2),2)
  
viajes_unicos
## # A tibble: 57 x 7
## # Groups:   origen, destino, coords_origen [56]
##    origen destino coords_origen coords_destino cant_viajes_dis~
##    <chr>  <chr>   <chr>         <chr>                     <int>
##  1 Peron~ 11 DE ~ -34.604793+-~ -34.55219+-58~                1
##  2 Peron~ 25 DE ~ -34.604793+-~ -34.599182+-5~               30
##  3 Peron~ 3 DE F~ -34.604793+-~ -34.560509+-5~                2
##  4 Peron~ Aeropa~ -34.604793+-~ -34.55693+-58~               71
##  5 Peron~ Aeropu~ -34.604793+-~ -34.804342+-5~               14
##  6 Peron~ Agrelo~ -34.604793+-~ -34.619075+-5~                4
##  7 Peron~ Albare~ -34.604793+-~ -34.691701+-5~                9
##  8 Peron~ Alem, ~ -34.604793+-~ -34.605451+-5~               12
##  9 Peron~ AV  BE~ -34.604793+-~ -34.615455+-5~                1
## 10 Peron~ Av Riv~ -34.604793+-~ -34.631827+-5~               10
## # ... with 47 more rows, and 2 more variables:
## #   duracion_viaje_promedio_1_tramo <dbl>, `2` <dbl>

 

Observaciones:

Calculo la duración promedio de un tramo del viaje (por ejemplo la ida) para poder comparar con lo obtenido de la app de Google

 

Recorro el set de datos “viajes unicos” y agrego columnas Time y Distance utilizando gmapsdistance

for (i in 1:nrow(viajes_unicos)) {
  print(i)
  o <- viajes_unicos[i, 3] %>% as.character()
  d <- viajes_unicos[i, 4] %>% as.character()
  
  print(o)
  print(d)
  
  query <- gmapsdistance(origin = o,
                         destination = d,
                         mode = "driving",
                         key="AIzaSyD2EC4CZII8wEzNdbWkNi_liRRamWb449g",
  )
  
  if (query$Status == "OK") {
    viajes_unicos$Time[i] <- query$Time
    viajes_unicos$Distance[i] <- query$Distance
  }else{
    viajes_unicos$Time[i] <- NA
    viajes_unicos$Distance[i] <- NA
  }
  
  Sys.sleep(1)
  
}
## [1] 1
## [1] "-34.604793+-58.369208"
## [1] "-34.55219+-58.456663"
## [1] 2
## [1] "-34.604793+-58.369208"
## [1] "-34.599182+-58.371245"
## [1] 3
## [1] "-34.604793+-58.369208"
## [1] "-34.560509+-58.45129"
## [1] 4
## [1] "-34.604793+-58.369208"
## [1] "-34.55693+-58.412636"
## [1] 5
## [1] "-34.604793+-58.369208"
## [1] "-34.804342+-58.55067"
## [1] 6
## [1] "-34.604793+-58.369208"
## [1] "-34.619075+-58.423305"
## [1] 7
## [1] "-34.604793+-58.369208"
## [1] "-34.691701+-58.611248"
## [1] 8
## [1] "-34.604793+-58.369208"
## [1] "-34.605451+-58.370335"
## [1] 9
## [1] "-34.604793+-58.369208"
## [1] "-34.615455+-58.45129"
## [1] 10
## [1] "-34.604793+-58.369208"
## [1] "-34.631827+-58.47168"
## [1] 11
## [1] "-34.604793+-58.369208"
## [1] "-34.679583+-58.450304"
## [1] 12
## [1] "-34.604793+-58.369208"
## [1] "-34.587579+-58.369092"
## [1] 13
## [1] "-34.604793+-58.369208"
## [1] "-34.667705+-58.356089"
## [1] 14
## [1] "-34.604793+-58.369208"
## [1] "-34.674591+-58.36367"
## [1] 15
## [1] "-34.604793+-58.369208"
## [1] "-34.615589+-58.423967"
## [1] 16
## [1] "-34.604793+-58.369208"
## [1] "-34.584747+-58.397739"
## [1] 17
## [1] "-34.604793+-58.369208"
## [1] "-34.667705+-58.356089"
## [1] 18
## [1] "-34.604793+-58.369208"
## [1] "-34.648556+-58.402189"
## [1] 19
## [1] "-34.604793+-58.369208"
## [1] "-34.639329+-58.362696"
## [1] 20
## [1] "-34.604793+-58.369208"
## [1] "-34.635071+-58.397425"
## [1] 21
## [1] "-34.604793+-58.369208"
## [1] "-34.591684+-58.374665"
## [1] 22
## [1] "-34.604793+-58.369208"
## [1] "-34.603491+-58.414216"
## [1] 23
## [1] "-34.604793+-58.369208"
## [1] "-34.623539+-58.382215"
## [1] 24
## [1] "-34.604793+-58.369208"
## [1] "-34.674345+-58.456803"
## [1] 25
## [1] "-34.604793+-58.369208"
## [1] "-34.587384+-58.453067"
## [1] 26
## [1] "-34.604793+-58.369208"
## [1] "-34.405486+-58.705836"
## [1] 27
## [1] "-34.604793+-58.369208"
## [1] "-34.581243+-58.402024"
## [1] 28
## [1] "-34.604793+-58.369208"
## [1] "-34.582356+-58.402579"
## [1] 29
## [1] "-34.604793+-58.369208"
## [1] "-34.573892+-58.418461"
## [1] 30
## [1] "-34.604793+-58.369208"
## [1] "-34.66933+-58.466922"
## [1] 31
## [1] "-34.604793+-58.369208"
## [1] "-34.570003+-58.433604"
## [1] 32
## [1] "-34.604793+-58.369208"
## [1] "-34.599754+-58.397926"
## [1] 33
## [1] "-34.604793+-58.369208"
## [1] "-34.612127+-58.424129"
## [1] 34
## [1] "-34.604793+-58.369208"
## [1] "-34.574095+-58.421458"
## [1] 35
## [1] "-34.604793+-58.369208"
## [1] "-34.589203+-58.419093"
## [1] 36
## [1] "-34.604793+-58.369208"
## [1] "-34.61417+-58.439875"
## [1] 37
## [1] "-34.604793+-58.369208"
## [1] "-34.606614+-58.42611"
## [1] 38
## [1] "-34.604793+-58.369208"
## [1] "-34.617621+-58.404053"
## [1] 39
## [1] "-34.604793+-58.369208"
## [1] "-34.592797+-58.390641"
## [1] 40
## [1] "-34.604793+-58.369208"
## [1] "-34.711907+-58.492146"
## [1] 41
## [1] "-34.604793+-58.369208"
## [1] "-34.542573+-58.455394"
## [1] 42
## [1] "-34.604793+-58.369208"
## [1] "-34.58322+-58.393951"
## [1] 43
## [1] "-34.604793+-58.369208"
## [1] "-34.591275+-58.385837"
## [1] 44
## [1] "-34.604793+-58.369208"
## [1] "-34.5568+-58.506721"
## [1] 45
## [1] "-34.604793+-58.369208"
## [1] "-34.588652+-58.383823"
## [1] 46
## [1] "-34.604793+-58.369208"
## [1] "-34.615507+-58.374597"
## [1] 47
## [1] "-34.604793+-58.369208"
## [1] "-34.615507+NA"
## [1] 48
## [1] "-34.604793+-58.369208"
## [1] "-34.609703+-58.407361"
## [1] 49
## [1] "-34.604793+-58.369208"
## [1] "-34.54187+-58.522394"
## [1] 50
## [1] "-34.604793+-58.369208"
## [1] "-34.609657+-58.390298"
## [1] 51
## [1] "-34.604793+-58.369208"
## [1] "-34.589143+-58.398404"
## [1] 52
## [1] "-34.604793+-58.369208"
## [1] "-34.514948+-58.482784"
## [1] 53
## [1] "-34.604793+-58.369208"
## [1] "-38.1645+-57.6472"
## [1] 54
## [1] "-34.604793+-58.369208"
## [1] "-34.604235+-58.369376"
## [1] 55
## [1] "-34.604793+-58.369208"
## [1] "-34.616389+-58.424418"
## [1] 56
## [1] "-34.604793+-58.369208"
## [1] "-34.577237+-58.409961"
## [1] 57
## [1] "-34.604793+-58.369208"
## [1] "-34.642916+-58.492227"

 

Observaciones:

Time se registra en segundos, Distance se registra en metros.

 

 

Calculo Tiempo y distancia en minutos y kilómetros

viajes_unicos <- viajes_unicos %>% 
  mutate(tiempo_min = round(Time/60,2)) %>% 
  mutate(distancia_km = round(Distance/1000,2))
viajes_unicos
## # A tibble: 57 x 11
## # Groups:   origen, destino, coords_origen [56]
##    origen destino coords_origen coords_destino cant_viajes_dis~
##    <chr>  <chr>   <chr>         <chr>                     <int>
##  1 Peron~ 11 DE ~ -34.604793+-~ -34.55219+-58~                1
##  2 Peron~ 25 DE ~ -34.604793+-~ -34.599182+-5~               30
##  3 Peron~ 3 DE F~ -34.604793+-~ -34.560509+-5~                2
##  4 Peron~ Aeropa~ -34.604793+-~ -34.55693+-58~               71
##  5 Peron~ Aeropu~ -34.604793+-~ -34.804342+-5~               14
##  6 Peron~ Agrelo~ -34.604793+-~ -34.619075+-5~                4
##  7 Peron~ Albare~ -34.604793+-~ -34.691701+-5~                9
##  8 Peron~ Alem, ~ -34.604793+-~ -34.605451+-5~               12
##  9 Peron~ AV  BE~ -34.604793+-~ -34.615455+-5~                1
## 10 Peron~ Av Riv~ -34.604793+-~ -34.631827+-5~               10
## # ... with 47 more rows, and 6 more variables:
## #   duracion_viaje_promedio_1_tramo <dbl>, `2` <dbl>, Time <dbl>,
## #   Distance <dbl>, tiempo_min <dbl>, distancia_km <dbl>

   

Grafico tiempo estimado por google, duración viaje promedio un tramo

Selecciono los datos a graficar

Para simplificar el grafico se seleccionan los destinos con más de 20 km de recorrido y se quita la “Residencia Presidencial de Chapadmalal” porque funciona como outlier y desestabiliza el gráfico.
viajes_unicos_20 <- viajes_unicos %>% 
  filter(distancia_km>20) %>% 
  filter(destino!="Residencia Presidencial de Chapadmalal")
viajes_unicos_20
## # A tibble: 5 x 11
## # Groups:   origen, destino, coords_origen [5]
##   origen destino coords_origen coords_destino cant_viajes_dis~
##   <chr>  <chr>   <chr>         <chr>                     <int>
## 1 Peron~ Aeropu~ -34.604793+-~ -34.804342+-5~               14
## 2 Peron~ Albare~ -34.604793+-~ -34.691701+-5~                9
## 3 Peron~ COUNTR~ -34.604793+-~ -34.405486+-5~                1
## 4 Peron~ Mercad~ -34.604793+-~ -34.711907+-5~               13
## 5 Peron~ Posada~ -34.604793+-~ -34.54187+-58~               14
## # ... with 6 more variables: duracion_viaje_promedio_1_tramo <dbl>,
## #   `2` <dbl>, Time <dbl>, Distance <dbl>, tiempo_min <dbl>,
## #   distancia_km <dbl>

   

Armo la lista de datos

dat <- data.frame(
  tiempo_1_tramo_estimado = viajes_unicos_20$duracion_viaje_promedio_1_tramo,
  tiempo_google = viajes_unicos_20$tiempo_min,
  destino = viajes_unicos_20$destino
)

dat_long <- dat %>%
  gather("Estimaciones", "Minutos", -destino)
#esto genera un lista de destino|estimaciones|minutos (repite destino para cada una de las variables)

   

Grafico de los dos tiempos de viaje.

ggplot(dat_long, aes(x = destino, y = Minutos, fill = Estimaciones)) +
  geom_col(position = "dodge")+ #evita que se colapsen las columas y las muestra separadas
  theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(
       title="Comparacion de Tiempos de Viaje por Destino", 
       subtitle = "Tiempo Promedio Estimado Remiseria vs Tiempo Estimado Google",
       x = "Destinos",
       y = "Duración en Minutos" )

 

Observaciones:

Una posible causa de la gran diferencia de los tiempos de viaje es que generalmente los choferes esperan a los pasajeros en los destinos. Para mejorar el control podría registrarse el tiempo de espera en destino.

   


Conclusiones Generales

Se podría analizar la posibilidad de:

Respecto a los choferes asignados a funcionarios:

Flexibilizar la asignación de los chofferes a funcionarios determinados para que puedan realizar más viajes. Podría definirse una cantidad de choferes asignados a funcionarios pero no individualmente sino como una guardia especial.

En general I:

Podría pensarse en prioridades (tanto de funcioanrios como de dependencias) para el uso del los vehículos y no en asignaciones fijas y poder distribuir los viajes a los choferes según disponibilidad y no tanto por asignación. Ver gráfico “Cantidad de viajes / horas de viaje por vehículo”

En general II

Los datos registrados no sos suficientes para llevar un control adecuado de los viajes de la remisería. Sería adecuado contar con un sistema de seguimiento vehicular satelital

     


FIN